// modules/fileHandler.js
const fs = require("fs");
const path = require("path");
const dayjs = require("dayjs");
const multer = require("multer");

// 文件类型与文件夹名称的映射
const fileTypeToFolder = {
  image: "images",
  video: "videos",
  audio: "audios",
  application: "documents",
  text: "documents",
  // 你可以继续添加其他类型...
};
// 定义详细的文件类型
const imageTypes = ["jpeg", "jpg", "png", "gif", "bmp", "webp"]; // 图片类型
const videoTypes = ["mp4", "mov", "avi", "mkv", "wmv", "flv"]; // 视频类型
const documentsTypes = ["pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt"];
const allType = [...imageTypes, ...videoTypes, ...documentsTypes];
// 确保目录存在
const ensureDirectoryExistence = (filePath) => {
  try {
    if (!fs.existsSync(filePath)) {
      fs.mkdirSync(filePath, { recursive: true }); // 递归创建目录
    }
  } catch (err) {
    console.error("创建目录时出错:", err);
  }
};

// 根据文件类型选择存储路径
const getDestinationPath = (file) => {
  // 根据文件类型决定存储位置，可以根据 MIME 类型判断
  console.log("文件类型", file.mimetype);

  const fileType = file.mimetype.split("/")[0]; // 获取文件类型，如 image、video
  const typeFolder = fileTypeToFolder[fileType] || "others"; // 如果找不到类型则默认 'others'

  // 获取当前日期
  const dateFolder = dayjs().format("YYYY-MM-DD");
  // 生成目标文件路径
  const uploadPath = path.join(__dirname, "..", "uploads", typeFolder, dateFolder);

  // 确保目录存在
  ensureDirectoryExistence(uploadPath);
  return { uploadPath, typeFolder, dateFolder };
};

// 使用 multer 的存储配置
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const { uploadPath, typeFolder, dateFolder } = getDestinationPath(file);
    // 设置 文件访问路径，用于前端访问
    file.fileAccessPath = `/${typeFolder}/${dateFolder}`;
    cb(null, uploadPath); // 指定上传的文件存储路径
  },
  filename: (req, file, cb) => {
    // 使用时间戳 + 随机数生成文件名
    const timestamp = Date.now();
    const randomString = Math.random().toString(36).substring(2, 15);
    const fileExtension = path.extname(file.originalname);
    const filename = `${timestamp}-${randomString}${fileExtension}`;
    cb(null, filename); // 设置上传文件名
  },
});
/**
 * 创建 multer 配置
 * @param {Object} options 配置选项
 * @param {Number} options.fileSize 文件大小限制，单位为字节，默认为 50MB
 * @param {Array} options.filetype 允许的文件类型，默认为图片和视频类型
 * @returns {Object} multer 配置
 */
const createMulterConfig = (options = {}) => {
  const { fileSize, filetype } = options;
  const allowedTypes = filetype || allType; // 允许的文件类型
  // 文件类型校验函数
  const fileFilter = (req, file, cb) => {
    const allowedTypesRegExp = new RegExp(allowedTypes.join("|"), "i"); // 允许的文件类型
    // 更改上面的文件类型，区分图片和视频
    const extname = allowedTypesRegExp.test(path.extname(file.originalname).toLowerCase()); // 检查扩展名
    const mimetype = allowedTypesRegExp.test(file.mimetype); // 检查 MIME 类型
    const fileType = file.mimetype.split("/")[0]; // 获取文件类型，如 image、video
    const typeFolder = fileTypeToFolder[fileType] || "others";
    req.fileType = typeFolder;
    if (!(extname && mimetype)) {
      req.multerErrorMessage = "不支持的文件类型";
      cb(null, false);
      return;
    }

    cb(null, true); // 文件通过校验
  };

  return multer({
    storage,
    fileFilter,
    limits: { fileSize: fileSize || 50 * 1024 * 1024 }, // 限制文件大小为 50MB
  });
};

module.exports = {
  createMulterConfig,
};
